package park;

import java.util.ArrayList;

public class J19Generic {

	public static void main(String[] args) {
		//고정크기 배열	
		Tiger zoo1[] = new Tiger[3]; //호랑이를 가두기 위한 동물원 
		Lion zoo2[] = new Lion[3]; 	 //사자를 가두기 위한 동물원 
		Zibra zoo3[] = new Zibra[3]; //얼룩말을 가두기 위한 동물원 
		
		
		Animal zoo4[] = new Animal[3];
		//호랑이 , 사자 , 얼룩말을 가둘수 있는 동물원
		//호랑이 , 사자 , 얼룩말은 animal과 상속관계
		Object zoo5[] = new Object[3];
		//호랑이 , 사자 , 얼룩말 뿐만 아니라 언급되지 않은 다른 동물들도 가둘수 있는 동물원
		//Object 클래스는 모든 클래스의 조상
		
	
		zoo4[0] = new Tiger();
		zoo4[1] = new Lion();
		zoo4[2] = new Zibra();
		//zoo4[1] = new Monkey(); Monkey는 Animal과 상속관계가 아니므로 오류가 난다.
		
		zoo5[0] = new Tiger();
		zoo5[1] = new Monkey();
		
		Animal ani1 = zoo4[1];
		//Lion lion1 = zoo4[1]; 오류! Animal 객체를 Lion 객체에 저장하라면 먼저  downcasting해야 함
		Lion lion1 = (Lion)zoo4[1];
		//따라서 , downcasting시 명시적으로 변환하려는 자료형을 기술하는것은 다소 귀찮을 수 있음 (중요!)
		
		//컬렉션(가변크기 배열)
		//컬렉션 에서는 어떤 종류의 자료를 담을지 모르기 때문에 최상위 조상객체인 Object형태로
		//저장 및 관리하도록 설계되어 있음
		//배열과 같은성질
		ArrayList zoo6 = new ArrayList(); //JDK4이하에서는 이렇게 썼음
		zoo6.add(new Tiger());
		zoo6.add(new Lion());
		zoo6.add(new Zibra());
		zoo6.add(new Monkey());
		zoo6.add(new Whale());
		
		//지네릭을 이용하면 프로그래머가 컬렉션에 사용할 객체의 유형을 명확하게 지정해서
		//이 유형과 다른 객체는 저장되지 못하게함 따라서,컴파일시 오류확인이 빨라짐
		ArrayList<Tiger> zoo7 = new ArrayList<Tiger>();
		
		zoo7.add(new Tiger());
		//zoo7.add(new Lion()); 오류! <>값이 Tiger만 허용하기 때문
		//zoo7에는 지네릭으로 Tiger만 객체저장훌 수 있도록 한정시킴 
		//따라서 예상치 못한 오류가 발생할 수 있는 가능성은 낮아짐
		
		ArrayList<Lion> zoo8 = new ArrayList<>(); //JDK7 에서는 이렇게 사용
		
		
		
	}

}

class Animal{}
class Tiger extends Animal{}
class Lion extends Animal{}
class Zibra extends Animal{}
class Monkey{}
class Whale{}
